#ifndef RECURSO_DE_ALMACENAMIENTO_H_
#define RECURSO_DE_ALMACENAMIENTO_H_

#include "../classes/almacenamiento/AlmacenamientoBuffer.h"
#include "../classes/almacenamiento/AlmacenamientoDisco.h"
#include "../classes/almacenamiento/Almacenamiento.h"
#include "../enums.inc.h"
#include "Dato.h"
#include "Compuesto.h"
#include "etg_almacenamiento.inc.h"
#include "../classes/etg_recursos/EtgRecEscrituraDirecta.h"
#include "../classes/etg_recursos/EtgRecUnAlmacenamiento.h"
#include "../classes/etg_recursos/EstrategiaRecurso.h"
#include <vector>
#include <exception>

using namespace std;


/**
 * Desde esta clase se hace los controles sobre las distintas partes: almacenamiento y su estrategia, 
 * estrategias de indice y estrategia de recurso de almacenamineto.
 * 
 * */
class RecursoDeAlmacenamiento{
		
	private:
	
		/*
		Etg_Almacenamiento *estrategiaAlm;
		
		TipoMemoria tipoMem;
		*/
		EstrategiaRecurso *recurso;
		Almacenamiento **almacenamiento; //puede tener 1 o 2
		EstrategiaIndice *indice;
		PrimaryKey *PK;
		char *path;
		void *ptrBuff;
		FILE* fp;
	
		void definirAlmacenemiento(TipoAlmacenamiento tipo);
		void definirEstrategia(TipoEstrategia tipoE, TipoAlmacenamiento tipoA);
		void definirIndice(TipoIndice tipoI,PrimaryKey *PK);
			
	public:
        // archivo
		RecursoDeAlmacenamiento(char *path, TipoAlmacenamiento tipoA, TipoEstrategia tipoE, TipoMemoria tipoM, TipoIndice tipoI , PrimaryKey *PK);

		// buffer
		RecursoDeAlmacenamiento(unsigned int tamBuffer, TipoAlmacenamiento tipoA, TipoEstrategia tipoE, TipoMemoria tipoM, TipoIndice tipoI ,  PrimaryKey *PK);
		
		// ambos
		RecursoDeAlmacenamiento(char *path, unsigned int tamBuffer, TipoAlmacenamiento tipoA, TipoEstrategia tipoE, TipoMemoria tipoM, TipoIndice tipoI ,PrimaryKey *PK);
		
		/*
		 * Metodos/operaciones del usuario sobre el toolkit...
		*/
		
		
		/**
		 * Permite realizar inserciones individuales de datos nuevos.
		 * 
		 * @param Dato* dato: contiene el dato a insertar
		 *  
		 * */
		void insertar(Dato *dato);
		
		/**
		 * Permite realizar modificaciones  a los datos ya cargados al toolkit.
		 * 
		 * @param Dato* dato: contiene el dato a modificar
		 *  
		 * */
		void modificar(Dato *datoAux);
		
		/**
		 * Permite eliminar datos existentes en el toolkit.
		 * 
		 * @param Dato* dato: el dato contiene solo los campos necesarios para identificarlo
		 *  
		 * */
		void eliminar(Dato *datoAux);//aca el dato tambien??
		
		/**
		 * Permite eliminar datos existentes en el toolkit.
		 * 
		 * @param Dato* datoAux:  el dato contiene solo los campos necesarios para identificarlo
		 *  
		 * */
		void leer(Dato *datoAux);//aca el dato tambien??
		
		/**
		 * Permite listar datos desde la aquel cuya clave es la inicial hasta encontrar el final.
		 * 
		 * @param Dato* dini: el dato contiene solo los campos necesarios para identificarlo
		 * @param Dato* dfin: el dato contiene solo los campos necesarios para identificarlo
		 *  
		 * */
//		void listar(Dato *dini, Dato *dfin); //TODO
		
		~RecursoDeAlmacenamiento();
		
	
};

#endif /*RECURSODEALMACENAMIENTO_H_*/

